﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
using Model.Presupuesto;
using System.Collections.ObjectModel;

namespace DataBase.Presupuesto
{
    public class BDPresupuesto
    {

        static string conexion = "Data Source=JCIDatabase.db.10200093.hostedresource.com; Initial Catalog=JCIDatabase; User ID=JCIDatabase; Password='ucbJCI2012!'";
        public static void EditarElementoPresupuesto(int gestion, string codigo, int cantidad, double valor)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Update [PresupuestoUsado] Set Cantidad=@can,ValorUnitario=@val Where GestionPresupuesto=@ges And CodigoIE=@cod";
                 comando.Parameters.AddWithValue("ges", gestion);
                 comando.Parameters.AddWithValue("can", cantidad);
                 comando.Parameters.AddWithValue("cod", codigo);
                 comando.Parameters.AddWithValue("val", valor);
                 canal.Open();
                 comando.ExecuteNonQuery();

             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
         public static void incrementarUsado(int gestion, long evento, float cantidad)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Update [PresupuestoUsado] Set Usado=Usado+@cant Where GestionPresupuesto=@ges and CodigoIE=@cod ";
                 comando.Parameters.AddWithValue("ges", gestion);
                 comando.Parameters.AddWithValue("cod", evento);
                 comando.Parameters.AddWithValue("cant", cantidad);
                 
                 
                 canal.Open();
                 comando.ExecuteNonQuery();
               
             }
             catch (Exception)
             { 
             }
         }
        public static void EliminarIE(long codigo,int gestion)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Delete From [PresupuestoUsado] Where CodigoIE=@cod And GestionPresupuesto=@ges";
                 comando.Parameters.AddWithValue("cod",codigo);
                 comando.Parameters.AddWithValue("ges", gestion);
               
                 canal.Open();
                 comando.ExecuteNonQuery();

             }
             catch (Exception)
             {
                 throw new Exception("Error al eliminar");
             }
         }
        public static void asignarPrograma(int gestion, string codigo, long programa)
        {
            try
            {
                SqlConnection canal = new SqlConnection(conexion);
                SqlCommand comando = canal.CreateCommand();
                comando.CommandText = "Insert Into [PresupuestoPrograma](Gestion,CodigoEvento,CodigoPrograma) Values (@ges,@cod,@prog)";
                comando.Parameters.AddWithValue("ges", gestion);
                comando.Parameters.AddWithValue("cod", codigo);
                comando.Parameters.AddWithValue("prog",programa );
                
                canal.Open();
                comando.ExecuteNonQuery();

            }
          
            catch (Exception ex)
            {
                throw ex;
            }
        }
         public static void UsarPresupuesto(int gestion, string codigo, double valor, int cantidad,long programa)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Insert Into [PresupuestoUsado](GestionPresupuesto,CodigoIE,ValorUnitario,Cantidad,Usado) Values (@ges,@cod,@val,@cant,@usa)";
                 comando.Parameters.AddWithValue("ges", gestion);
                 comando.Parameters.AddWithValue("cod", codigo);
                 comando.Parameters.AddWithValue("val", valor);
                 comando.Parameters.AddWithValue("cant", cantidad);
                 comando.Parameters.AddWithValue("usa", 0);
                 canal.Open();
                 comando.ExecuteNonQuery();
                 if (programa > -1)
                 {
                     asignarPrograma(gestion,codigo,programa);
                 }
             }
             catch (SqlException)
             {
                 throw new Exception("Ya registraste este evento para esta gestion");
             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
         public static bool ExisteEvento(string nombre,char tipo)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Select Nombre From [Evento] Where Nombre=@nom And Tipo=@tip";
                 comando.Parameters.AddWithValue("nom", nombre);
                 comando.Parameters.AddWithValue("tip", tipo);
                 canal.Open();
                 SqlDataReader reader = comando.ExecuteReader();
                 return reader.HasRows;
             }
             catch (SqlException)
             {
                 throw new Exception("Error al ver");
             }
             catch (Exception ex)
             {
                 throw ex;
             }
             
             
         }
         public static double Total(int gestion, char tipo)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "SELECT SUM(PresupuestoUsado.Cantidad * PresupuestoUsado.ValorUnitario) AS Suma FROM     PresupuestoUsado INNER JOIN Evento ON PresupuestoUsado.CodigoIE = Evento.Codigo WHERE  (Evento.Tipo = @tip) AND (PresupuestoUsado.GestionPresupuesto = @ges)";
                 comando.Parameters.AddWithValue("ges", gestion);
                 comando.Parameters.AddWithValue("tip", tipo);
                 canal.Open();
                 SqlDataReader reader = comando.ExecuteReader();
                 if (reader.HasRows)
                 {
                     if (reader.Read())
                     {
                         
                         if (DBNull.Value != reader["Suma"])
                             return Convert.ToDouble(reader["Suma"]) ;

                     }
                 }
                 return 0;
                     
             }
             catch (SqlException)
             {
                 throw new Exception("Error al ver");
             }
             catch (Exception ex)
             {
                 throw ex;
             }


         }
        public static void RegistrarEvento(string evento,char tipo,string nombre)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Insert Into [Evento](Descripcion,Tipo,Nombre) Values (@des,@tip,@nom)";
                 comando.Parameters.AddWithValue("des", evento);
                 comando.Parameters.AddWithValue("tip", tipo);
                 comando.Parameters.AddWithValue("nom", nombre);
                 canal.Open();
                 comando.ExecuteNonQuery();    
             }
             catch (SqlException)
             {
                 throw new Exception("Ya tiene un evento con este nombre");
             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
        public static Collection<IngresoEgreso> getIE(int gestion,char tipo)
        {
            try
            {
                SqlConnection canal = new SqlConnection(conexion);
                SqlDataAdapter comando = new SqlDataAdapter();
                comando.SelectCommand = new SqlCommand("Select Descripcion,ValorUnitario,Cantidad,(ValorUnitario*Cantidad) as Total From [Evento],[PresupuestoUsado] Where CodigoIE=Evento.Codigo And Tipo=@tip And GestionPresupuesto=@ges", canal);
                comando.SelectCommand.Parameters.AddWithValue("ges", gestion);
                comando.SelectCommand.Parameters.AddWithValue("tip", tipo);
                canal.Open();
                DataTable dt = new DataTable();
                comando.Fill(dt);
                
                Collection<IngresoEgreso> IE = new Collection<IngresoEgreso>();
                int numero=1;
                foreach (DataRow row in dt.Rows)
                {
                    IngresoEgreso ingresoEgreso = new IngresoEgreso
                    {
                        Cantidad = Convert.ToInt32(row["Cantidad"]),
                        Descripcion = row["Descripcion"].ToString(),
                        ValorUnitario = Convert.ToDouble(row["ValorUnitario"]),
                        Total = Convert.ToDouble(Convert.ToInt32(row["Cantidad"]) * Convert.ToDouble(row["ValorUnitario"])),
                        Numero = numero
                    };
                    IE.Add(ingresoEgreso);
                   
                    numero++;
                }
                return IE;

                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static ICollection getIngresos(int gestion,char tipo)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlDataAdapter comando = new SqlDataAdapter();
                 comando.SelectCommand = new SqlCommand("Select Descripcion,ValorUnitario,Cantidad,(Cantidad*ValorUnitario) as Total,CodigoIE,Nombre From [Evento],[PresupuestoUsado] Where CodigoIE=Evento.Codigo And Tipo=@tip And GestionPresupuesto=@ges",canal);
                 comando.SelectCommand.Parameters.AddWithValue("ges", gestion);
                 comando.SelectCommand.Parameters.AddWithValue("tip", tipo);
                 canal.Open();
                 DataTable dt = new DataTable();
                 dt.Columns.Add(new DataColumn("Descripcion", typeof(String)));
                 dt.Columns.Add(new DataColumn("ValorUnitario", typeof(Double)));
                 dt.Columns.Add(new DataColumn("Cantidad", typeof(int)));
                 dt.Columns.Add(new DataColumn("Total", typeof(Double)));
                 dt.Columns.Add(new DataColumn("CodigoIE", typeof(long)));
                 dt.Columns.Add(new DataColumn("Nombre", typeof(String)));
                 
                 comando.Fill(dt);
                 DataView dv = new DataView(dt);
                 return dv;
                 

             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
        public static void CerrarPresupuesto(int gestion)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Update [Presupuesto] Set Estado='False' Where Gestion=@ges";
                 comando.Parameters.AddWithValue("ges", gestion);
                 canal.Open();
                 comando.ExecuteNonQuery();
                 
             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
        public static ICollection getPresupuestos(int inicio, int fin,bool todos,bool especifico,bool edicion)
        {
            try
            {
                SqlConnection canal = new SqlConnection(conexion);
                SqlDataAdapter comando = new SqlDataAdapter();
                if (todos)
                    comando.SelectCommand = new SqlCommand("Select Gestion,Estado From [Presupuesto] Where Gestion>=@ini And Gestion<=@fin", canal);
                else
                {
                    comando.SelectCommand = new SqlCommand("Select Gestion,Estado From [Presupuesto] Where Gestion>=@ini And Gestion<=@fin And Estado=@est", canal);
                    comando.SelectCommand.Parameters.AddWithValue("est",especifico);
                }
                comando.SelectCommand.Parameters.AddWithValue("ini", inicio);
                comando.SelectCommand.Parameters.AddWithValue("fin", fin);
                canal.Open();
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("Gestion", typeof(int)));
                dt.Columns.Add(new DataColumn("Estado", typeof(bool)));
                dt.Columns.Add(new DataColumn("EstadoTexto", typeof(string)));
             
                comando.Fill(dt);
                foreach (DataRow row in dt.Rows)
                {
                    
                        if (Convert.ToBoolean(row["Estado"]))
                            row["EstadoTexto"] = "Abierto";
                        else
                            row["EstadoTexto"] = "Cerrado";
                        if (!edicion)
                            row["Estado"] = false;
                    
                }
                DataView dv = new DataView(dt);
                return dv;


            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static bool getEstado(int gestion)
         {
             try
             {
                 SqlConnection canal = new SqlConnection(conexion);
                 SqlCommand comando = canal.CreateCommand();
                 comando.CommandText = "Select Estado From [Presupuesto] Where Gestion=@ges";
                 comando.Parameters.AddWithValue("ges", gestion);
                 canal.Open();
                 SqlDataReader reader=comando.ExecuteReader();
                 if (reader.HasRows)
                 {
                     reader.Read();
                     return Convert.ToBoolean(reader["Estado"]);
                 }
                 else
                     throw new Exception("No existe la gestion seleccionada");
                 
             }
             catch (Exception ex)
             {
                 throw ex;
             }
         }
        public static bool existeGestion(int gestion)
        {
            try
            {
                SqlConnection canal = new SqlConnection(conexion);
                SqlCommand comando = canal.CreateCommand();
                comando.CommandText = "Select Gestion From [Presupuesto] Where Gestion=@ges";
                comando.Parameters.AddWithValue("ges", gestion);
                canal.Open();
                SqlDataReader reader = comando.ExecuteReader();
                return reader.HasRows;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static bool CrearPresupuesto(int gestion)
        {
            try
            {
                SqlConnection canal = new SqlConnection(conexion);
                SqlCommand comando = canal.CreateCommand();
                comando.CommandText = "Insert Into Presupuesto(Gestion,Estado) Values (@ges,@est)";
                comando.Parameters.AddWithValue("ges", gestion);
                comando.Parameters.AddWithValue("est", true);
                canal.Open();
                comando.ExecuteNonQuery();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
